package aboutInherit

/**
  * 用来说明构造器顺序,不要在trait的构造器中依赖抽象字段.否则会到意想不到的输出
  */
trait FileLog{
  val filename:String
  println(filename)
}

class SavingsAccount extends FileLog{
  val filename = "testFile"
}

object TestSavingsAccount{
  def main(args: Array[String]) {
    val s = new SavingsAccount

    /**
      * 以下会输出:
      * null
      * testFile
      * 原因在于构造器顺序,混入特质的对象在构造时会执行:
      * 1.首先调用超类的构造器
      * 2.特质构造器在超类构造器之后,类构造器之前执行
      * 3.特质由左到右被构造
      * 4.如果多个特质共有一个父特质,而那个父特质以及已经被构造,则不会被再次构造
      * 5.所有特质构造完毕,子类被构造
      */
    println(s.filename)
  }
}
